#include <regx52.h>
#include "I2C.h"

#define AT24C02_WRITE 0xa0  // 定义AT24C02写操作的设备地址（前8位为设备地址，后1位为写标志）
#define AT24C02_READ 0xA1   // 定义AT24C02读操作的设备地址（前8位为设备地址，后1位为读标志）

#define Text 0

/**
 * @brief 向AT24C02 EEPROM写入数据
 * 
 * 该函数通过I2C协议将数据写入AT24C02 EEPROM指定的地址。它依次发送起始信号、写操作地址、字节地址和数据， 
 * 并在每个步骤后进行ACK确认，确保数据成功传输。成功写入后，LCD显示相应的调试信息。
 * 
 * @param Word_Address  要写入的字节地址
 * @param Data          要写入的数据
 * 
 * @return 无
 */
void AT24C02_Write(unsigned char Word_Address, unsigned char Data)
{
    I2C_Start();                   // 启动I2C通信
    I2C_SendByte(AT24C02_WRITE);   // 发送AT24C02的写操作地址
    if(Text == 1) { 
        if (I2C_ReadAck() == 0)    // 如果接收到ACK确认信号
            LCD_ShowNum(1, 1, 1, 1);  // 在LCD上显示调试信息
    } else {
        I2C_ReadAck();
    }
    I2C_SendByte(Word_Address);    // 发送字节地址
    if(Text == 1) {
        if (I2C_ReadAck() == 0)    // 如果接收到ACK确认信号
            LCD_ShowNum(1, 3, 1, 1);  // 在LCD上显示调试信息
    } else {
        I2C_ReadAck();
    }
    I2C_SendByte(Data);            // 发送数据
    if(Text == 1) {
        if (I2C_ReadAck() == 0)    // 如果接收到ACK确认信号
            LCD_ShowNum(1, 5, 1, 1);  // 在LCD上显示调试信息
    } else {
        I2C_ReadAck();
    }
    I2C_Stop();                    // 停止I2C通信
}

/**
 * @brief 从AT24C02 EEPROM读取数据
 * 
 * 该函数通过I2C协议从AT24C02 EEPROM读取指定地址的数据。它首先发送写操作地址和字节地址， 
 * 然后重新启动I2C，发送读操作地址，接着读取数据，并发送ACK确认信号。读取的数据将返回给调用者。
 * 
 * @param Word_Address  要读取的字节地址
 * 
 * @return 读取到的数据
 */
unsigned char AT24C02_Read(unsigned char Word_Address)
{
    unsigned char Data;           // 用于存储读取的数据

    I2C_Start();                   // 启动I2C通信
    I2C_SendByte(AT24C02_WRITE);   // 发送AT24C02的写操作地址
    if(Text == 1) {
        if (I2C_ReadAck() == 0)    // 如果接收到ACK确认信号
            LCD_ShowNum(1, 7, 1, 1);  // 在LCD上显示调试信息
    } else {
        I2C_ReadAck();
    }
    I2C_SendByte(Word_Address);    // 发送字节地址
    if(Text == 1) {
        if (I2C_ReadAck() == 0)    // 如果接收到ACK确认信号
            LCD_ShowNum(1, 9, 1, 1);  // 在LCD上显示调试信息
    } else {
        I2C_ReadAck();
    }

    I2C_Start();                   // 重新启动I2C通信
    I2C_SendByte(AT24C02_READ);    // 发送AT24C02的读操作地址
    if(Text == 1) {
        if (I2C_ReadAck() == 0)    // 如果接收到ACK确认信号
            LCD_ShowNum(1, 11, 1, 1); // 在LCD上显示调试信息
    } else {
        I2C_ReadAck();
    }

    Data = I2C_ReadByte();         // 读取数据
    I2C_SendAck(1);                // 发送ACK确认信号（表示继续通信）
    I2C_Stop();                    // 停止I2C通信
    return Data;                   // 返回读取到的数据
}
